package com.wzxy.dao.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;

import com.wzxy.dao.IBaseDao;

@Repository("baseDao")
public class BaseDaoImpl<T> implements IBaseDao<T> {
	private SessionFactory sessionFactory;
	protected Session session;
	private Class<T> clazz;

	@SuppressWarnings("unchecked")
	public BaseDaoImpl() {
		// 当前对象的直接超类的 Type
		Type genericSuperclass = getClass().getGenericSuperclass();
		if (genericSuperclass instanceof ParameterizedType) {
			// 参数化类型
			ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass;
			// 返回表示此类型实际类型参数的 Type 对象的数组
			Type[] actualTypeArguments = parameterizedType
					.getActualTypeArguments();
			this.clazz = (Class<T>) actualTypeArguments[0];
		} else {
			this.clazz = (Class<T>) genericSuperclass;
		}
	}

	public Class<T> getCls() {
		System.out.println("------> clazz = " + clazz);
		return clazz;
	}

	/**
	 * 通过spring注入sessionFactory
	 * 
	 * @param sessionFactory
	 */
	@Resource(name = "sessionFactory")
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	/**
	 * 获取session
	 * 
	 * @return
	 */
	public Session getSession() {
		return sessionFactory.getCurrentSession();
	}

	/**
	 * 关闭session
	 */
	public void closeSession() {
		getSession().close();
	}

	/**
	 * 添加数据
	 */
	public void add(T t) {
		System.out.println("新增的数据：" + t.toString());
		this.getSession().save(t);
	}

	/**
	 * 删除数据
	 */
	public void delete(Serializable id) {
		this.getSession().delete(this.load(id));
	}

	/**
	 * 更新数据
	 */
	public void update(T t) {
		this.getSession().update(t);
	}

	/**
	 * 查询某用户
	 */
	@SuppressWarnings("unchecked")
	public T load(Serializable id) {
		System.out.println("load()----->" + getCls());
		return (T) this.getSession().get(getCls(), id);
	}

	/**
	 * 查询一组数据
	 */
	@SuppressWarnings("unchecked")
	public List<T> list(String hql, Object[] args) {
		Query q = this.getSession().createQuery(hql);
		if (args != null) {
			for (int i = 0; i < args.length; i++) {
				q.setParameter(i, args[i]);
			}
		}
		return (List<T>) q.list();
	}

	public void flush() {
		this.getSession().flush();
	}

	/**
	 * 分页查询
	 */
	@SuppressWarnings("unchecked")
	public List<T> queryForPage(int offset, int length, String hql) {
		Query q = this.getSession().createQuery(hql);
		q.setFirstResult(offset); // 当前页数
		q.setMaxResults(length); // 每页显示的记录数
		return (List<T>) q.list();
	}

	/**
	 * 获取总记录数
	 */
	public int getAllRowCount(String hql, Object[] args) {
		return list(hql, args).size();
	}


}
